/**
 * 
 */
package fr.gfi.agraf.persistence.dao.impl;

import java.util.List;

import javax.persistence.NoResultException;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;

import fr.gfi.agraf.persistence.dao.IProfilDAO;
import fr.gfi.agraf.persistence.entity.Profil;
import fr.gfi.agraf.utils.PropertiesUtils;

/**
 * @author Zakaria
 *
 */
@Repository
public class ProfilDAO extends AbstractGenericDAO<Profil> implements IProfilDAO {

	private static final String IDS = "ids";
	private static final String HQL_PROFIL_SELECT_BY_IDS = "hql.profil.selectByIds";
	private static final String ID_UTILISATEUR = "idUtilisateur";
	private static final String HQL_PROFIL_SELECT_BY_UTILISATEUR_ID = "hql.profil.selectByUtilisateurId";
	private static final String HQL_PROFIL_SELECT_BY_LIBELLE = "hql.profil.selectByLibelle";
	private static final String LIBELLE = "libelle";
	/**
	 * Logger
	 */
	private final static Logger LOGGER = Logger.getLogger(ProfilDAO.class);

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IProfilDAO#getProfilByLibelle(java.lang.
	 * String)
	 */
	public Profil getProfilByLibelle(final String libelle) {
		Profil profil = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_PROFIL_SELECT_BY_LIBELLE);
		try {
			// Execute la query
			profil = em.createQuery(query, Profil.class).setParameter(LIBELLE, libelle).getSingleResult();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}
		return profil;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IProfilDAO#getProfilByUtilisateurId(java
	 * .lang.Long)
	 */
	public List<Profil> getProfilsByUtilisateurId(final Long idUtilisateur) {
		List<Profil> profils = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_PROFIL_SELECT_BY_UTILISATEUR_ID);
		try {
			// Execute la query
			profils = em.createQuery(query, Profil.class).setParameter(ID_UTILISATEUR, idUtilisateur)
					.getResultList();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}
		return profils;
	}

	public List<Profil> getProfilsByIds(final List<Long> ids) {
		List<Profil> profils = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_PROFIL_SELECT_BY_IDS);
		try {
			// Execute la query
			profils = em.createQuery(query, Profil.class).setParameter(IDS, ids).getResultList();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}
		return profils;
	}
}
